package pruefungsPlanung;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import einlesenUndDatenverwaltung.*;
import ausgabeUndDatenverwaltung.*;


/**
 * Logikklasse zur Ermittlung der Zufriedenheit der einzelnen Studenten mit dem ermittelten Pruefungsplan
 * Dazu werden die erstellten Platzkarten mit dem Attribut istZeitminimierer der Studenten der Studentenliste abgeglichen
 *
 * @author (Hendrik Hertel) 
 * @version (12.12.2013)
 */
public class ZufriedenheitsMesser {
	
	// Deklarieren der Klassenvariablen	
	// Deklarieren einer öffentlichen Variable vom Typ int
	// fuer die Anzahl zufriedener Studenten
	public int anzz;
	
	// Deklarieren einer öffentlichen Variable vom Typ int
	// fuer die Anzahl unzufriedener Studenten
	public int anzu;
	
	// Deklarieren einer öffentlichen Variable vom Typ int
	// fuer die Anzahl bei der Zufriedenheitsmessung berücksichtigter Studenten
	// (Studenten mit mind. einer Kursbuchung)
	public int anzs;
	
	// Deklarieren einer Hashmap zur Verwaltung der Ergebnisse der Zufriedenheitsmessung in Form eines Boolean-Wertes
	// fuer eine ggf. erforderliche logische Weiterverarbeitung
	private HashMap<Student, Boolean> hmb;
	
	// Deklarieren einer Hashmap zur Verwaltung der Ergebnisse der Zufriedenheitsmessung in Form eines Strings
	// fuer die Ausgabe
	private HashMap<Student, String> hms;
	
	// Deklarieren und Initialisieren von Variablen vom Typ String
	// mit den möglichen Ergebnissen der Zufriedenheitsmessung für die Ausgabe
	private String sc1 = "\n Pruefungen: An einem Tag \n Zufrieden: Ja \n";
	private String sc2 = "\n Pruefungen: An einem Tag \n Zufrieden: Nein \n";
    private String sc3 = "\n Pruefungen: An mehr als einem Tag \n Zufrieden: Nein \n";
    private String sc4 = "\n Pruefungen: An mehr als einem Tag \n Zufrieden: Ja \n";
	
	/**
	 * Konstruktor zur Erzeugung der Obkjekte der Klasse ZufriedenheitsMesser
	 */
	public ZufriedenheitsMesser() {
		// Inititalisieren der Klassenvariablen fuer die Anzahl der Studenten
		anzz = 0;
		anzu = 0;
		anzz = 0;
	}
	
	/**
	 * Die Methode erwartet eine PlatzKartenListe und eine Studentenliste
	 * Die Methode prueft in Abhaengigkeit der vorhandenen PlatzKarten in der PlatzKartenListe die Zufriedenheit aller Studenten-Objekte der Studentenliste
	 * Ausschlaggebend dafuer ist das Attribut istZeitminimierer.
	 * Die (Un-)Zufriedenheit wird als Boolean und als String jeweils in einer Hashmap gespeichtert.
	 * Ist der Student ein Zeitminimierer bzw. hat die Praeferenz alle Pruefungen am Tag abzulegen und existiert fuer diesen Student nur eine Platzkarte, dann zufriedenheit==true
	 * Ist der Student kein Zeitminimierer bzw. hat die Praeferenz moeglichst nur eine Pruefung am Tag abzulegen und existiert fuer diesen Student mehr als eine Platzkarte, dann zufriedenheit==true
	 * Bei einer anderen Kombination von istZeitminimierer und Platzkarten zufriedenheit==false
	 *
	 * @param platzkartenliste
	 * @return platzkartenliste
	 */
	public PlatzKartenListe pruefeZufriedenheit(PlatzKartenListe pkl){
		
		// Erstellen der Hashmaps zur Aufnahme der Ergebnisse der Zufriedenheitsmessung
		// in Form eines Boolean-Wertes bzw. eines Strings
		hmb = new HashMap<Student, Boolean>();
		hms = new HashMap<Student, String>();
		
		// Durchlaufen der Elemente der Platzkartenliste
		for (Enumeration e = pkl.getPlatzkartenliste().elements(); e
				.hasMoreElements();) {
			PlatzKarte pk = (PlatzKarte) e.nextElement();
			Student s = pk.getStudent();
			
			// Deklarieren und Initialisiern einer Variable vom Typ int
			// als Zaehler der Platzkarten und somit der Pruefungstage eines Studenten
			int z = 0;
			
			// Vergleich des aktuellen und des nächsten Erlements der Paltzkartenliste
			// Insofern es sich um den selben Studenten handelt, inkrementieren des Zaehlers,
			// da der jeweilige Student mehr als eine Paltzkarte und somit mehr als einen Pruefungstag hat
			for (Enumeration e2 = pkl.getPlatzkartenliste().elements(); e2
					.hasMoreElements();) {
				PlatzKarte pk2 = (PlatzKarte) e2.nextElement();
				Student s2 = pk2.getStudent();
				if (s == s2)  
					z++;

			// Logischer Abgleich des Attributs istZeitminimierer des jeweiligen Studenten mit dem Zaehler
			// und setzen des Ergebnisses der Zufriedenheitsmessung in der HashMap in Form eines Boolean-Wertes bzw. Strings	
			if (s.getIstZeitminimierer() && z==1){
				hms.put(s, sc1);
				hmb.put(s, true);
				}
				
			else if (s.getIstZeitminimierer()==false && z==1){
				hms.put(s, sc2);
			    hmb.put(s, false);
			}

			else if (s.getIstZeitminimierer() && z!=1){
				hms.put(s, sc3);
			    hmb.put(s, false);
			}
			
			else if (s.getIstZeitminimierer()==false && z!=1){
				hms.put(s, sc4);
			    hmb.put(s, true);
			}
					
			}
			
		}	
	
		// Abgleich der Anzahl der Key-Value Paare in den HashMaps im Sinne eins Plausi-Checks
		// Sind beide Werte identisch speichern der Anzahl der Key-Value Paare und somit der Anzahl
		// der auf (Un-)Zufriendenheit geprüften Studenten (Studenten mit mind. einer Kursbuchung) in der öffentlichen Variable anzs
		// sowie Ermittlung Anzahl der zufriedenen bzw. unfriedenen Studenten und speichern in der Variable anzz bzw. anzu
		if (hms.size()==hmb.size()){
		anzs = hmb.size();
		
		 Iterator<Entry<Student, Boolean>> iter = hmb.entrySet().iterator();
	        while (iter.hasNext()) {
	            Entry<Student, Boolean> entry = iter.next();
	            if (entry.getValue().equals(true))
	            	anzz++;
	            	
	            	else if (entry.getValue().equals(false))
	            		anzu++;

	        }
	        }
		
		else 
        System.out.println("--- Fehler: Ungleichmaeßige Befuellung der beiden (Boolean bzw. Sting) HashMaps ---");
		
		return pkl;
	
	}
			
	/**
	 * Methode zur Ausgabe der Ergebnisse der Zufriedenheitsmessung
	 * Die komplette Ausgabe wird im Zusammenspiel mit der toString Methode der Klasse Student erzeugt
	 * 
	 * @return (String) - Zeichenkette mit dem Ergebnis der Zufriedenheitsmessung als Ergaenzung
	 * zu den Eigenschaften des Studenten aus der entsprechenden toString Methode der Klasse Student
	 */
	public String toString(){
	
		StringBuilder sb = new StringBuilder();
		
        Iterator<Entry<Student, String>> iter = hms.entrySet().iterator();
        while (iter.hasNext()) {
            Entry<Student, String> entry = iter.next();
            sb.append(entry.getKey());
            sb.append(entry.getValue());
        }
        return sb.toString();
		
	}
	
}